set_project("CppHodgepodge")
set_rules('mode.debug', 'mode.release')

set_languages('c++20', 'c11')
-- 使用gcc编译
set_toolchains('gcc')
-- 启用所有警告，并当作错误处理
set_warnings('all', 'error')
-- 设置目标的输出目录
set_targetdir('$(buildir)')

if is_mode('debug') then
    set_symbols('debug')  -- 启用调试符号
    set_optimize('none')  -- 禁用优化
    -- set_policy("check.auto_ignore_flags", false)  -- 禁用自动忽略链接选项
    set_policy("build.sanitizer.address", true)
else
    set_symbols('hidden')  -- 隐藏符号
end

-- 添加编译宏
add_defines("PROJECT_DIR=" .. "\"$(projectdir)\"")

add_includedirs('inc')

function get_dir_basename(path)
    -- 将路径按'/'分割为数组
    dir_table = path:split('/')
    -- 返回数组最后一个元素
    return dir_table[#dir_table]
end

--[[
    函数功能: 基于单文件构建目标程序
    参数:
        filename: 要编译的源文件名
        packs: 要链接的包列表
        libs: 要手动链接的库列表
    修改日志:
        25-06-13 增加libs参数，允许手动链接外部库
    ]]
function build_target(filename, packs, libs)
    base_name = path.basename(filename)
    prefix = get_dir_basename(os.curdir()) .. '_'
    target_name = prefix .. base_name
    target(target_name)
        set_kind('binary')
        set_default('false')
        add_files(filename)
        add_linkdirs('$(projectdir)/lib')
        add_packages(packs)
        add_links(libs)
    target_end()
end

for _, dir in ipairs(os.dirs('*')) do
    if os.isdir(dir) and os.isfile(dir .. '/xmake.lua') then
        -- 如果目录下有 xmake.lua 文件，则加载该文件
        -- printf('curdir: %s\n', dir)
        includes(dir)
    end
end
